/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.espe.ccsoft.mantenimiento.bean;

import ec.edu.espe.ccsoft.mantenimiento.modelos.Acceso;
import ec.edu.espe.ccsoft.mantenimiento.modelos.Accion;
import ec.edu.espe.ccsoft.mantenimiento.modelos.Rol;
import ec.edu.espe.ccsoft.mantenimiento.servicios.AccesoServicio;
import ec.edu.espe.ccsoft.mantenimiento.servicios.RolServicio;
import ec.edu.espe.ccsoft.mantenimiento.utils.ManejoAcciones;
import ec.edu.espe.ccsoft.mantenimiento.utils.Mensajes;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;

/**
 *
 * @author misahaelfernandez
 */
@ManagedBean
@ViewScoped
public class AccesoBean extends ManejoAcciones implements Serializable {

    @EJB
    private AccesoServicio accesoServicio;
    @EJB
    private RolServicio rolServicio;
    private List<Acceso> accesos;
    private List<Acceso> menus;
    private List<Acceso> submenus;
    private List<Rol> roles;
    private Acceso acceso;
    private Mensajes mensaje;

    private List<Accion> insertarAcciones() {

        List<Accion> acciones = new ArrayList<>();

        Accion crear = new Accion();
        crear.setAcceso(acceso);
        crear.setNombre("CREAR");

        Accion editar = new Accion();
        editar.setAcceso(acceso);
        editar.setNombre("EDITAR");

        Accion ver = new Accion();
        ver.setAcceso(acceso);
        ver.setNombre("VER");

        acciones.add(crear);
        acciones.add(editar);
        acciones.add(ver);

        return acciones;
    }

    @PostConstruct
    public void init() {
        accesos = accesoServicio.obtenerTodoActivos();
        menus = accesoServicio.obtenerMenusRaices();
        roles = rolServicio.obtenerTodosActivos();
        mensaje = new Mensajes();
    }

    public void cargarNuevo() {
        acceso = new Acceso();
        super.nuevoRegistro();
        tituloDialogo = tituloDialogo + " Acceso";
    }

    public void cargarModificar() {
        super.modificarRegistro();
        tituloDialogo = tituloDialogo + " Acceso";
    }

    public void cargarDetalles() {
        super.detallesRegistro();
        tituloDialogo = tituloDialogo + " Acceso";
    }

    public void guardar() {
        try {
            if (accesoServicio.obtenerPorNombre(acceso.getNombre())) {
                acceso.setAccionList(insertarAcciones());
                acceso.setFechaCreacion(Calendar.getInstance().getTime());
                acceso.setEstado(true);
                acceso.setVisible(true);
                acceso.setVista("Administrar");
                acceso.setComando("/" + acceso.getControlador() + "/" + acceso.getVista());
                this.accesoServicio.crear(acceso);
                accesos.add(acceso);
                mensaje.addMessageSuccefull("Información", "El acceso ha sido creado con éxito");
                RequestContext.getCurrentInstance().update("@form");
                RequestContext.getCurrentInstance().execute("PF('dlDialogVar').hide();");
            } else {

                mensaje.addMessageSuccefull("Error", "El acceso ya se encuentra registrado");

            }
        } catch (Exception e) {
            mensaje.addMessageError("Error", "Error al crear el acceso " + e.getMessage());
        }
    }

    public void modificar() {
        try {
            this.accesoServicio.actualizar(acceso);
            if (!acceso.getEstado()) {
                accesos.remove(acceso);
                mensaje.addMessageSuccefull("Información", "El acceso ha sido eliminado con éxito");
            } else {

                mensaje.addMessageSuccefull("Información", "El acceso ha sido modificado con éxito");
            }
            RequestContext.getCurrentInstance().update("@form");
            RequestContext.getCurrentInstance().execute("PF('dlDialogVar').hide();");
        } catch (Exception e) {
            mensaje.addMessageError("Error", "Error al modificar el acceso " + e.getMessage());
        }
    }

    public Acceso getAcceso() {
        return acceso;
    }

    public void setAcceso(Acceso acceso) {
        this.acceso = acceso;
    }

    public List<Acceso> getAccesos() {
        return accesos;
    }

    public List<Rol> getRoles() {
        return roles;
    }

    public List<Acceso> getMenus() {
        return menus;
    }

    public void setMenus(List<Acceso> menus) {
        this.menus = menus;
    }

    public List<Acceso> getSubmenus() {
        submenus = accesoServicio.obtenerSubMenu(acceso.getMenu());
        return submenus;
    }

    public void setSubmenus(List<Acceso> submenus) {
        this.submenus = submenus;
    }

    public Acceso obtenerAcceso(Object codigo) {
        try {
            Integer codigoRol = Integer.parseInt(codigo.toString());
            return accesoServicio.obtenerPorCodigo(codigoRol);
        } catch (Exception e) {
            return null;
        }
    }
}
